/**
 * @file systemType.h
 * @author your name (you@domain.com)
 * @brief 定时器操作
 * @version 0.1
 * @date 2025-04-30
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef __SYSTEM_TYPE_H__
#define __SYSTEM_TYPE_H__
#include "xmzTypeDefine.h"
#include "db_raw_access.h"

typedef struct {
  Bool IN;         // 0启动输入
  Time PT;         // 1接通延时的持续时间（毫秒，必须为正数）
  Time ET;         // 3当前时间值（毫秒，相对时间）
  Bool Q;          // 5输出
  Time last_ET;    // 上一次记录的ET值给保持性定时器用
  Bool last_in;    // 6上一次 IN 状态，用于上升沿检测
  Time start_time; // 7定时器启动时间
  Bool is_running; // 9定时器运行状态
} IEC_Timer;
void IEC_Timer_pack(IEC_Timer* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_Timer_unpack(IEC_Timer* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  UInt  YEAR;        /*年 1970 到 2262*/
  USInt MONTH;       /*月 1 到 12*/
  USInt DAY;         /*日 1 到 31*/
  USInt WEEKDAY;     /*星期 1（星期日）到 7（星期六） 值输入中不考虑工作日。*/
  USInt HOUR;        /*小时 0 到 23*/
  USInt MINUTE;      /*分钟 0 到 59*/
  USInt SECOND;      /*秒 0 到 59*/
  UDInt MILLISECOND; /*0 到 999999999*/
} DTL;               /*DTL结构体字节12*/
void DTL_pack(DTL* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void DTL_unpack(DTL* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

// struct IEC_Counter {
//     Bool CU; /*加计数输入*/
//     Bool CD; /*减计数输入*/
//     Bool R;  /*重置输入*/
//     Bool LD; /*装载输入*/
//     Int  PV; /*输出 QU 被设置的值/LD = 1 的情况下，输出 CV 被设置的值。*/
//     Bool QU; /*加计数器的状态*/
//     Bool QD; /*减计数器的状态*/
//     Int  CV; /*int,char,wchar,date当前计数器值*/
// };

typedef struct {
  Bool CU; //  加计数输入脉冲
  Bool CD; //  减计数输入脉冲
  Bool R;  //  CV清0
  Bool LD; //  CV设置为PV
  Bool QU; //  输出位
  Bool QD; //  输出位
  SInt PV; //  预设值
  SInt CV; //  计数值
  Bool last_CU;
  Bool last_CD;
  Bool last_R;
  Bool last_LD;
} IEC_SCOUNTER, CTU_SINT, CTD_SINT, CTUD_SINT;
void IEC_SCOUNTER_pack(IEC_SCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_SCOUNTER_unpack(IEC_SCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  Bool CU; //  加计数输入脉冲
  Bool CD; //  减计数输入脉冲
  Bool R;  //  CV清0
  Bool LD; //  CV设置为PV
  Bool QU; //  输出位
  Bool QD; //  输出位
  Int  PV; //  预设值
  Int  CV; //  计数值
  Bool last_CU;
  Bool last_CD;
  Bool last_R;
  Bool last_LD;
} IEC_COUNTER, CTU_INT, CTD_INT, CTUD_INT;
void IEC_COUNTER_pack(IEC_COUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_COUNTER_unpack(IEC_COUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  Bool CU; //  加计数输入脉冲
  Bool CD; //  减计数输入脉冲
  Bool R;  //  CV清0
  Bool LD; //  CV设置为PV
  Bool QU; //  输出位
  Bool QD; //  输出位
  DInt PV; //  预设值
  DInt CV; //  计数值
  Bool last_CU;
  Bool last_CD;
  Bool last_R;
  Bool last_LD;
} IEC_DCOUNTER, CTU_DINT, CTD_DINT, CTUD_DINT;
void IEC_DCOUNTER_pack(IEC_DCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_DCOUNTER_unpack(IEC_DCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  Bool  CU; //  加计数输入脉冲
  Bool  CD; //  减计数输入脉冲
  Bool  R;  //  CV清0
  Bool  LD; //  CV设置为PV
  Bool  QU; //  输出位
  Bool  QD; //  输出位
  USInt PV; //  预设值
  USInt CV; //  计数值
  Bool  last_CU;
  Bool  last_CD;
  Bool  last_R;
  Bool  last_LD;
} IEC_USCOUNTER, CTU_USINT, CTD_USINT, CTUD_USINT;
void IEC_USCOUNTER_pack(IEC_USCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_USCOUNTER_unpack(IEC_USCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  Bool CU; //  加计数输入脉冲
  Bool CD; //  减计数输入脉冲
  Bool R;  //  CV清0
  Bool LD; //  CV设置为PV
  Bool QU; //  输出位
  Bool QD; //  输出位
  UInt PV; //  预设值
  UInt CV; //  计数值
  Bool last_CU;
  Bool last_CD;
  Bool last_R;
  Bool last_LD;
} IEC_UCOUNTER, CTU_UINT, CTD_UINT, CTUD_UINT;
void IEC_UCOUNTER_pack(IEC_UCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_UCOUNTER_unpack(IEC_UCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  Bool  CU; //  加计数输入脉冲
  Bool  CD; //  减计数输入脉冲
  Bool  R;  //  CV清0
  Bool  LD; //  CV设置为PV
  Bool  QU; //  输出位
  Bool  QD; //  输出位
  UDInt PV; //  预设值
  UDInt CV; //  计数值
  Bool  last_CU;
  Bool  last_CD;
  Bool  last_R;
  Bool  last_LD;
} IEC_UDCOUNTER, CTU_UDINT, CTD_UDINT, CTUD_UDINT;
void IEC_UDCOUNTER_pack(IEC_UDCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void IEC_UDCOUNTER_unpack(IEC_UDCOUNTER* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

typedef struct {
  UInt  HSC;
  Bool  DIR;
  Bool  CV;
  Bool  RV;
  Bool  PERIOD;
  Int   NEW_DIR;
  UDInt NEW_CV;
  UDInt NEW_RV;
  Int   NEW_PERIOD;
  Bool  BUSY;
  Word  STATUS;
} CTRL_HSC;

void CTRL_HSC_pack(CTRL_HSC* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);
void CTRL_HSC_unpack(CTRL_HSC* s_ptr, uint8_t* buffer, size_t buffer_size, uint16_t byte_offset);

#endif
